package springboot.study.project.util.proxy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @ClassName: CglibProxy
 * @Description: 基于Cglib的动态代理
 * @Author: liu-hao
 * @Date: 2021-02-20 18:07
 * @Version: 1.0
 **/
public class CglibProxy implements MethodInterceptor {

    // 被代理对象
    private Object object;
    // 日志对象
    Logger logger = LoggerFactory.getLogger(JdkProxy.class);

    // 这里的目标类型为Object，则可以接受任意一种参数作为被代理类，实现了动态代理
    public Object getInstance(Object target) {
        this.object = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback((Callback) this);
        // 注意该处代理的创建过程
        Object proxyObj = enhancer.create();
        return proxyObj;// 返回代理对象
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        logger.info("---------------cglib前置增强---------------");
        // 注意这里调用目标方法使用的是 methodProxy 和 代理对象 o
        Object result = methodProxy.invokeSuper(o, objects);
        logger.info("---------------cglib后置增强---------------");
        return result;
    }
}
